;
;  PROGRAM:  CCPLOC
;  AUTHOR:  RICHARD CONN
;  VERSION:  1.1
;  DATE:  6 JAN 83
;  PREVIOUS VERSIONS:  1.0 (14 DEC 82)
;
VERS	EQU	11

;
;	This program is Copyright (c) 1982, 1983 by Richard Conn
;	All Rights Reserved
;
;	ZCPR2 and its utilities, including this one, are released
; to the public domain.  Anyone who wishes to USE them may do so with
; no strings attached.  The author assumes no responsibility or
; liability for the use of ZCPR2 and its utilities.
;
;	The author, Richard Conn, has sole rights to this program.
; ZCPR2 and its utilities may not be sold without the express,
; written permission of the author.
;


;
;	CCPLOC -- CCP Locator
;
;	The purpose of CCPLOC is to locate the addresses of the running
; CP/M 2.2 CCP, BDOS, and BIOS, and to display these values to the user.
;

;
;  CP/M Constants
;
bdos	equ	5	; BDOS Entry
cr	equ	0dh
lf	equ	0ah

;
;  SYSLIB Externals
;
	ext	print,phl4hc,pa2hc,cout,crlf

;
;  Branch to Start of Program
;
	jmp	start

;
;******************************************************************
;
;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
;
;	This data block precisely defines the data format for
; initial features of a ZCPR2 system which are required for proper
; initialization of the ZCPR2-Specific Routines in SYSLIB.
;

;
;  EXTERNAL PATH DATA
;
EPAVAIL:
	DB	0FFH	; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
EPADR:
	DW	40H	; ADDRESS OF EXTERNAL PATH IF AVAILABLE

;
;  INTERNAL PATH DATA
;
INTPATH:
	DB	0,0	; DISK, USER FOR FIRST PATH ELEMENT
			; DISK = 1 FOR A, '$' FOR CURRENT
			; USER = NUMBER, '$' FOR CURRENT
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0
	DB	0,0	; DISK, USER FOR 8TH PATH ELEMENT
	DB	0	; END OF PATH

;
;  MULTIPLE COMMAND LINE BUFFER DATA
;
MCAVAIL:
	DB	0FFH	; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
MCADR:
	DW	0FF00H	; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE

;
;  DISK/USER LIMITS
;
MDISK:
	DB	4	; MAXIMUM NUMBER OF DISKS
MUSER:
	DB	31	; MAXIMUM USER NUMBER

;
;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
;
DOK:
	DB	0FFH	; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
UOK:
	DB	0FFH	; ALLOW USER CHANGE? (0=NO, 0FFH=YES)

;
;  PRIVILEGED USER DATA
;
PUSER:
	DB	10	; BEGINNING OF PRIVILEGED USER AREAS
PPASS:
	DB	'chdir',0	; PASSWORD FOR MOVING INTO PRIV USER AREAS
	DS	41-($-PPASS)	; 40 CHARS MAX IN BUFFER + 1 for ending NULL

;
;  CURRENT USER/DISK INDICATOR
;
CINDIC:
	DB	'$'	; USUAL VALUE (FOR PATH EXPRESSIONS)

;
;  DMA ADDRESS FOR DISK TRANSFERS
;
DMADR:
	DW	80H	; TBUFF AREA

;
;  NAMED DIRECTORY INFORMATION
;
NDRADR:
	DW	00000H	; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
NDNAMES:
	DB	64	; MAX NUMBER OF DIRECTORY NAMES
DNFILE:
	DB	'NAMES   '	; NAME OF DISK NAME FILE
	DB	'DIR'		; TYPE OF DISK NAME FILE

;
;  REQUIREMENTS FLAGS
;
EPREQD:
	DB	000H	; EXTERNAL PATH?
MCREQD:
	DB	000H	; MULTIPLE COMMAND LINE?
MXREQD:
	DB	000H	; MAX USER/DISK?
UDREQD:
	DB	000H	; ALLOW USER/DISK CHANGE?
PUREQD:
	DB	000H	; PRIVILEGED USER?
CDREQD:
	DB	000H	; CURRENT INDIC AND DMA?
NDREQD:
	DB	000H	; NAMED DIRECTORIES?
Z2CLASS:
	DB	0	; CLASS 0
	DB	'ZCPR2'
	DS	10	; RESERVED

;
;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
;
;******************************************************************
;

;
;  Start of Program
;
start:
	call	print
	db	'CCPLOC  Version '
	db	(vers/10)+'0','.',(vers mod 10)+'0'
	db	cr,lf
	db	cr,lf,'CP/M Element	Base Page	Base Address'
	db	cr,lf,'------------	---------	------------',0

	lhld	bdos+1	;get base address of BDOS
	mvi	l,0	;set to even boundary
	lxi	d,-800H	;back up to start of CCP (size of CCP)
	dad	d	;HL pts to CCP
	call	print
	db	cr,lf,'    CCP		','   ',0
	mov	a,h	;base page in A
	call	pa2hc	;print as hex
	call	ph	;print H
	call	filler	;next field
	call	phl4hc	;print full address
	call	ph

	lhld	bdos+1	;just get base address of BDOS again
	call	print
	db	cr,lf,'    BDOS	','   ',0
	mov	a,h	;base page in A
	call	pa2hc	;print as hex
	call	ph
	call	filler
	call	phl4hc
	call	ph

	mvi	l,0	;set even page
	lxi	d,0e00h	;size of BDOS
	dad	d	;HL pts to BIOS
	call	print
	db	cr,lf,'    BIOS	','   ',0
	mov	a,h	;base page in A
	call	pa2hc	;print as hex
	call	ph
	call	filler
	call	phl4hc
	call	ph
	call	crlf	;new lines
	call	crlf
	ret

;
;  PH -- Print H followed
;
ph:
	mvi	a,'H'	;H
	jmp	cout

;
;  FILLER -- Jump Over to Next Field
;
filler:
	call	print
	db	'   ','	','     ',0
	ret

	end
